/**
 * SSR导出服务
 * 提供基于Vue SSR的组件导出能力，集成到现有导出系统
 */

import { ElMessage } from 'element-plus';
import autoComponentLoader from './AutoComponentLoader';
import { createSSRExporter } from '@/utils/componentSSRExporter';

class SSRExportService {
  constructor() {
    this.ssrExporters = new Map();
    this.initialized = false;
  }

  /**
   * 初始化SSR导出服务
   */
  async initialize() {
    if (this.initialized) return;
    
    try {
      // 获取组件列表
      const { componentPaths } = await autoComponentLoader.initialize();
      
      console.log('[SSRExportService] SSR导出服务初始化');
      this.initialized = true;
    } catch (error) {
      console.error('[SSRExportService] 初始化失败:', error);
      ElMessage.error('SSR导出服务初始化失败');
    }
  }

  /**
   * 获取组件的SSR导出处理器
   * @param {string} componentType 组件类型
   * @returns {Promise<Object|null>} 导出处理器或null
   */
  async getSSRExporter(componentType) {
    if (!this.initialized) {
      await this.initialize();
    }
    
    // 检查缓存
    if (this.ssrExporters.has(componentType)) {
      return this.ssrExporters.get(componentType);
    }
    
    try {
      // 加载组件
      const componentPath = autoComponentLoader.resolveComponentPath(componentType);
      if (!componentPath) return null;

      // 尝试加载SSR导出处理器
      try {
        const ssrExportModule = await import(
          /* @vite-ignore */ `../components/library/${componentPath}/export.ssr.js`
        );
        const exporter = ssrExportModule.default || ssrExportModule;
        this.ssrExporters.set(componentType, exporter);
        return exporter;
      } catch (ssrError) {
        // 如果没有专用的SSR导出处理器，则加载Vue组件并创建默认SSR导出处理器
        const componentModule = await import(
          /* @vite-ignore */ `../components/library/${componentPath}/index.vue`
        );
        const vueComponent = componentModule.default || componentModule;
        
        // 创建默认SSR导出处理器
        const defaultExporter = createSSRExporter(vueComponent);
        this.ssrExporters.set(componentType, defaultExporter);
        return defaultExporter;
      }
    } catch (error) {
      console.error(`[SSRExportService] 无法加载组件SSR导出处理器: ${componentType}`, error);
      return null;
    }
  }

  /**
   * 使用SSR渲染组件为HTML
   * @param {Object} component 组件数据
   * @returns {Promise<string|null>} 渲染后的HTML或null
   */
  async renderComponentToHTML(component) {
    const { type } = component;
    if (!type) return null;
    
    const exporter = await this.getSSRExporter(type);
    if (!exporter) return null;
    
    try {
      return await exporter.generateHTML(component);
    } catch (error) {
      console.error(`[SSRExportService] 组件${type}渲染失败:`, error);
      return null;
    }
  }

  /**
   * 生成组件的JavaScript代码
   * @param {Object} component 组件数据
   * @returns {Promise<string>} JS代码
   */
  async generateComponentJS(component) {
    const { type } = component;
    if (!type) return '';
    
    const exporter = await this.getSSRExporter(type);
    if (!exporter || !exporter.generateJS) return '';
    
    try {
      return exporter.generateJS(component);
    } catch (error) {
      console.error(`[SSRExportService] 生成组件${type}的JS失败:`, error);
      return '';
    }
  }

  /**
   * 生成组件的CSS代码
   * @param {Object} component 组件数据
   * @returns {Promise<string>} CSS代码
   */
  async generateComponentCSS(component) {
    const { type } = component;
    if (!type) return '';
    
    const exporter = await this.getSSRExporter(type);
    if (!exporter || !exporter.generateCSS) return '';
    
    try {
      return exporter.generateCSS(component);
    } catch (error) {
      console.error(`[SSRExportService] 生成组件${type}的CSS失败:`, error);
      return '';
    }
  }

  /**
   * 获取组件所需资源
   * @param {Object} component 组件数据
   * @returns {Promise<Array>} 资源列表
   */
  async getComponentResources(component) {
    const { type } = component;
    if (!type) return [];
    
    const exporter = await this.getSSRExporter(type);
    if (!exporter || !exporter.resources) return [];
    
    return exporter.resources;
  }
}

// 创建SSR导出服务单例
const ssrExportService = new SSRExportService();

export default ssrExportService; 